package com.mazaiting.face.ui.utils;

import android.graphics.*;
import android.hardware.Camera;
import android.os.Environment;
import com.mazaiting.log.L;

import java.io.*;

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-07-10
 * @description
 */
public class FileUtil {

    /**
     * 将字节数组转换为 Bitmap 图像
     *
     * @param data 图像数组
     * @return Bitmap
     */
    public static Bitmap byteToBitmap(byte[] data) {
        // Bitmap 选项
        BitmapFactory.Options options = new BitmapFactory.Options();
        // 是否加载到内存
//        options.inJustDecodeBounds = true;
        // 颜色格式
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        // 解析为 Bitmap
        return BitmapFactory.decodeByteArray(data, 0, data.length, options);
    }

    /**
     * 将 Bitmap 图像转换为字节数组
     * @param bitmap Bitmap 图像
     * @return 字节数组
     */
    public static byte[] bitmapToByte(Bitmap bitmap){
        // 创建字节数组输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 将 Bitmap 放入字节数组输出流中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        // 获取字节数组
        return baos.toByteArray();
    }

    /**
     * 获取 YUV 处理过的图片二进制数据
     *
     * @param data        源二进制数据
     * @param width 宽度
     * @param height 高度
     * @return YUV 处理过后的数据
     */
    public static byte[] getYuvImageData(byte[] data, int width, int height) {
        // YUV 图像
        YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
        // 创建输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 80--JPG图片的质量[0-100],100最高
        yuvimage.compressToJpeg(new Rect(0, 0, width, height), 30, baos);
        // 获取二进制数据
        return baos.toByteArray();
    }

    /**
     * 获取指定区域的内容
     * @param bitmap Bitmap 图像
     * @param rect 矩形
     * @return
     */
    public static Bitmap getSpecificArea(Bitmap bitmap, Rect rect) {
//        L.d("rect: " + rect.toString());
//        L.d("width: " + bitmap.getWidth());
//        L.d("height: " + bitmap.getHeight());
        return Bitmap.createBitmap(bitmap, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
    }

    /**
     * 根据角度旋转图形
     * @param bitmap 图像
     * @param angle 角度
     * @return 图像
     */
    public static Bitmap rotatedImageView(Bitmap bitmap, int angle) {
        //旋转图片 动作
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        // 创建新的图片
        return Bitmap.createBitmap(bitmap, 0, 0,
                bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }


    /**
     * 保存图片二进制数据为文件
     * @param bytes 二进制数据
     */
    public static void byteToImageFile(byte[] bytes) {
        try {
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "RedEye" + "/";
            File file = new File(path, System.currentTimeMillis() + ".jpeg");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bytes, 0, bytes.length);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            L.d(e.getMessage());
        }
    }

    /**
     * 保存 Bitmap 为图片文件
     * @param bitmap Bitmap 图像
     */
    public static void saveBitmapFile(Bitmap bitmap) {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "RedEye" + "/";
        File file = new File(path, System.currentTimeMillis() + ".jpeg");
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
            bos.flush();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}